﻿--Trigger 1 
--Geracao de log na tabela oportunidades
CREATE TABLE logoportunidades
(
  idlogoportunidades serial not null,
  descricao_novo character varying(500),
  descricao_antigo character varying(500),
  data_contato_novo date,
  data_contato_antigo date,
  data_finalzacao_novo date,
  data_finalzacao_antigo date,
  descricao_oportunidade_finalizado_novo character varying(500),
  descricao_oportunidade_finalizado_antigo character varying(500),
  fkidempresas_novo integer,
  fkidempresas_antigo integer,
  fkidcontatos_novo integer,
  fkidcontatos_antigo integer,
  fkidprodutos_novo integer,
  fkidprodutos_antigo integer,
  fkidfases_novo integer,
  fkidfases_antigo integer,
  fkidcampanhas_novo integer,
  fkidcampanhas_antigo integer,
  fkidusuarios_novo integer,
  fkidusuarios_antigo integer,
  fkidstatus_novo integer,
  fkidstatus_antigo integer
  );

CREATE OR REPLACE FUNCTION LOGOPORTUNIDADES_FUNC() RETURNS TRIGGER AS $LOGOPORTUNIDADES$
	DECLARE
		xoportunidades oportunidades%ROWTYPE;	
	BEGIN
		IF TG_OP = 'INSERT' THEN
			
			INSERT INTO logoportunidades VALUES (new.idoportunidades, new.descricao, NULL, new.data_contato, NULL, new.data_finalizacao, NULL, new.descricao_oportunidade_finalizado,
							     NULL, new.fkidempresas, NULL, new.fkidcontatos, NULL, new.fkidprodutos, 
							     NULL, new.fkidfases, NULL, new.fkidcampanhas, NULL, new.fkidusuarios, NULL, new.fkidstatus, NULL);	
							     RETURN NEW;		
	       END IF;
	       
	       IF TG_OP = 'UPDATE' THEN
			INSERT INTO logoportunidades VALUES(old.idoportunidades, new.descricao, old.descricao, new.data_contato, old.data_contato, new.data_finalizacao, old.data_finalizacao, new.descricao_oportunidade_finalizado,
							    old.descricao_oportunidade_finalizado, new.fkidempresas, old.fkidempresas, new.fkidcontatos, old.fkidcontatos, new.fkidprodutos, 
							    old.fkidprodutos, new.fkidfases, old.fkidfases, new.fkidcampanhas, old.fkidcampanhas, new.fkidusuarios, old.fkidusuarios, new.fkidstatus, old.fkidstatus);
							    RETURN NEW;
	       END IF;

	       IF TG_OP = 'DELETE' THEN
			
			INSERT INTO logoportunidades VALUES(old.idoportunidades,  NULL, old.descricao, NULL, old.data_contato, NULL, old.data_finalizacao, NULL,
							    old.descricao_oportunidade_finalizado, NULL, old.fkidempresas, NULL, old.fkidcontatos, NULL, 
							    old.fkidprodutos, NULL, old.fkidfases, NULL, old.fkidcampanhas, NULL, old.fkidusuarios, NULL, old.fkidstatus);			
							    RETURN OLD;
	       END IF;

	       
	       
	END;
$LOGOPORTUNIDADES$ LANGUAGE PLPGSQL;
 
CREATE TRIGGER LOGOPORTUNIDADES BEFORE INSERT OR UPDATE OR DELETE
ON oportunidades FOR EACH ROW EXECUTE PROCEDURE LOGOPORTUNIDADES_FUNC();

/*Trigger2
Geracao de log na tabela leads
*/

CREATE TABLE logleads
(
  idleads serial not null,
  nome_novo   character varying(100),
  nome_antigo character varying(100),
  empresa_novo character varying(100),
  empresa_antigo character varying(100),
  email_novo formato_email,
  email_antigo formato_email,
  telefone_novo telefone_brasil,
  telefone_antigo telefone_brasil,
  oberservacao_novo character varying(150),
  oberservacao_antigo character varying(150),
  fkidorigemleads_novo integer,
  fkidorigemleads_antigo integer,
  fkidstatus_novo integer,
  fkidstatus_antigo integer
);

CREATE OR REPLACE FUNCTION LOGLEADS_FUNC() RETURNS TRIGGER AS $LOGLEADS$
	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO logleads VALUES(new.idleads, new.nome, NULL, new.empresa, NULL, new.email, NULL, 
						    new.telefone, NULL, new.observacao, 
						    NULL, new.fkidorigemleads, NULL, new.fkidstatus, NULL);
						    RETURN NEW;			
		END IF;

		IF TG_OP = 'UPDATE' THEN
			INSERT INTO logleads VALUES(old.idleads, new.nome, old.nome, new.empresa, old.empresa, new.email, old.email, 
						    new.telefone, old.telefone, new.observacao, 
						    old.observacao, new.fkidorigemleads, old.fkidorigemleads, new.fkidstatus, old.fkidstatus);			
						    RETURN NEW;
		END IF;

		IF TG_OP = 'UPDATE' THEN
			INSERT INTO logleads VALUES(old.idleads, NULL, old.nome, NULL, old.empresa, NULL, old.email, 
						    NULL, old.telefone, NULL, 
						    old.observacao, NULL, old.fkidorigemleads, NULL, old.fkidstatus);			
						    RETURN OLD;
		END IF;
		
		RETURN NEW;
	END;
$LOGLEADS$ LANGUAGE PLPGSQL;


CREATE TRIGGER LOGLEADS BEFORE INSERT OR UPDATE OR DELETE
ON leads FOR EACH ROW EXECUTE PROCEDURE LOGLEADS_FUNC();


--Trigger3
--Geracao de log na tabela contatos
CREATE TABLE logcontatos (
  idlogcontatos serial not null,
  nome_novo character varying(100),
  nome_antigo character varying(100),
  email_novo character varying(50),
  email_antigo character varying(50),
  telefone_novo character varying(14),
  telefone_antigo character varying(14),
  celular_novo character varying(14),
  celular_antigo character varying(14),
  cargo_novo character varying(20),
  cargo_antigo character varying(20),
  observacao_novo character varying(200),
  observacao_antigo character varying(200),
  fkidempresas_novo integer,
  fkidempresas_antigo integer,
  fkidpais_novo integer,
  fkidpais_antigo integer,
  fkidestado_novo integer,
  fkidestado_antigo integer,
  fkidcidade_novo integer,
  fkidcidade_antigo integer,  
  fkidstatus_novo integer,
  fkidstatus_antigo integer
  );

  CREATE OR REPLACE FUNCTION LOGCONTATOS_FUNC() RETURNS TRIGGER AS $LOGCONTATOS$
	DECLARE	
	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO logcontatos VALUES (new.idcontatos, new.nome, NULL, new.email, NULL,
						        new.telefone, NULL, new.celular, NULL,
						        new.cargo, NULL, new.observacao, NULL,
						        new.fkidempresas, NULL, new.fkidpais, NULL, 
						        new.fkidestado, NULL, new.fkidcidade, NULL, 						        
						        new.fkidstatus, NULL);
						        RETURN NEW;
		END IF;
		
		IF TG_OP = 'UPDATE' THEN 
			INSERT INTO logcontatos VALUES (old.idcontatos, new.nome, old.nome, new.email, old.email,
						        new.telefone, old.telefone, new.celular, old.celular,
						        new.cargo, old.cargo, new.observacao, old.observacao,
						        new.fkidempresas, old.fkidempresas, new.fkidpais, old.fkidpais, 
						        new.fkidestado, old.fkidestado, new.fkidcidade, old.fkidcidade, 						        
						        new.fkidstatus, old.fkidstatus);
						        RETURN NEW;							
		END IF;

		IF TG_OP = 'DELETE' THEN 
			INSERT INTO logcontatos VALUES (old.idcontatos, NULL, old.nome, NULL, old.email,
						        NULL, old.telefone, NULL, old.celular,
						        NULL, old.cargo, NULL, old.observacao,
						        NULL, old.fkidempresas, NULL, old.fkidpais, 
						        NULL, old.fkidestado, NULL, old.fkidcidade, 						        
						        NULL, old.fkidstatus);							
						        RETURN OLD;
		END IF;

		RETURN NEW;
	END;
$LOGCONTATOS$ LANGUAGE PLPGSQL;

CREATE TRIGGER LOGCONTATOS BEFORE INSERT OR UPDATE
ON contatos FOR EACH ROW EXECUTE PROCEDURE LOGCONTATOS_FUNC();



--Trigger4
--Geracao de log na tabela usuarios
CREATE TABLE logusuarios 
(
  idlogusuarios serial not null,
  nome_novo character varying(100),
  nome_antigo character varying(100),
  email_novo character varying(50),
  email_antigo character varying(50),
  telefone_novo character varying(14),
  telefone_antigo character varying(14),
  celular_novo character varying(14),
  celular_antigo character varying(14),
  cpf_novo formato_cpf,
  cpf_antigo formato_cpf,
  rg_novo character varying(8),
  rg_antigo character varying(8),
  fkidpais_novo integer,
  fkidpais_antigo integer,
  fkidestado_novo integer,
  fkidestado_antigo integer,
  fkidcidade_novo integer,
  fkidcidade_antigo integer,
  senha_novo character varying(256),
  senha_antigo character varying(256),
  fkidstatus_novo integer,
  fkidstatus_antigo integer
  );

CREATE OR REPLACE FUNCTION LOGUSUARIOS_FUNC() RETURNS TRIGGER AS $LOGUSUARIOS$
	DECLARE	
	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO logusuarios VALUES (new.idusuarios, new.nome, NULL, new.email, NULL,
					        new.telefone, NULL, new.celular, NULL,
						new.cpf, NULL, new.rg, NULL, new.fkidpais, NULL, new.fkidestado, NULL,
						new.fkidcidade, NULL, new.senha, NULL, new.fkidstatus, 
						NULL);
						RETURN NEW;
		END IF;
						
		IF TG_OP = 'UPDATE' THEN
			INSERT INTO logusuarios VALUES (old.idusuarios, new.nome, old.nome, new.email, old.email,
					        new.telefone, old.telefone, new.celular, old.celular,
						new.cpf, old.cpf, new.rg, old.rg, new.fkidpais, old.fkidpais, new.fkidestado, old.fkidestado,
						new.fkidcidade, old.fkidcidade, new.senha, old.senha, new.fkidstatus, 
						old.fkidstatus);
						RETURN NEW;
		END IF;	

		IF TG_OP = 'DELETE' THEN
			INSERT INTO logusuarios VALUES (old.idusuarios, NULL, old.nome, NULL, old.email,
					        NULL, old.telefone, NULL, old.celular,
						NULL, old.cpf, NULL, old.rg, NULL, old.fkidpais, NULL, old.fkidestado,
						NULL, old.fkidcidade, NULL, old.senha, NULL, 
						old.fkidstatus);
						RETURN OLD;
		END IF;
		
		RETURN NEW;
	END;
$LOGUSUARIOS$ LANGUAGE PLPGSQL;

CREATE TRIGGER LOGUSUARIOS BEFORE INSERT OR UPDATE OR DELETE
ON usuarios FOR EACH ROW EXECUTE PROCEDURE LOGUSUARIOS_FUNC();



--trgger 5
--Geracao de log na tabela produtos
CREATE TABLE logprodutos
(
  idlogprodutos serial not null,
  nome_novo VARCHAR(50),
  nome_antigo VARCHAR(50),
  descricao_novo VARCHAR(200),
  descricao_antigo VARCHAR(200),
  fkIdStatus_novo integer,
  fkIdStatus_antigo integer
);

CREATE OR REPLACE FUNCTION LOG_PRODUTOS_FUNC() RETURNS TRIGGER AS $LOGPRODUTOS$
	DECLARE
		xprodutos produtos%ROWTYPE;	
	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO logprodutos VALUES(new.idprodutos, new.nome, NULL, 
							new.descricao, NULL,
							new.fkidstatus, NULL);
							RETURN NEW;
		END IF;
				
		IF TG_OP = 'UPDATE' THEN
			INSERT INTO logprodutos VALUES(old.idprodutos, new.nome, old.nome, 
							new.descricao, old.descricao,
							new.fkidstatus, old.fkidstatus);
							RETURN NEW;							
		END IF;

		IF TG_OP = 'DELETE' THEN
			INSERT INTO logprodutos VALUES(old.idprodutos, NULL, old.nome, 
							NULL, old.descricao,
							NULL, old.fkidstatus);	
							RETURN NEW;						
		END IF;
		
		RETURN NEW;
	END;
$LOGPRODUTOS$ LANGUAGE PLPGSQL;

CREATE TRIGGER LOGPRODUTOS BEFORE INSERT OR UPDATE
ON PRODUTOS FOR EACH ROW EXECUTE PROCEDURE LOG_PRODUTOS_FUNC();

--Trigger 6
--Geracao de log na tabela empresa
CREATE TABLE logempresas
(
  idlogempresas serial not null,
  nome_novo character varying(150),
  nome_antigo character varying(150),
  cnpj_novo character varying(18),
  cnpj_antigos character varying(18),
  telefone_novo character varying(14),
  telefone_antigo character varying(14),
  fax_novo character varying(14),
  fax_antigo character varying(14),
  fkidpais_novo integer,
  fkidpais_antigo integer,
  fkidestado_novo integer,
  fkidestado_antigo integer,
  fkidcidade_novo integer,
  fkidcidade_antigo integer,
  website_novo character varying(500),  
  website_antigo character varying(500),
  fkidstatus_novo integer,
  fkidstatus_antigo integer
 );

CREATE OR REPLACE FUNCTION LOG_EMPRESAS_FUNC() RETURNS TRIGGER AS $LOGEMPRESAS$
	DECLARE
		xempresas empresas%ROWTYPE;	
	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO logempresas VALUES (new.idempresas, new.nome, NULL, 
							new.cnpj, NULL, new.telefone, 
							NULL, new.fax, 
							NULL, new.fkidpais, 
							NULL, new.fkidestado, 
							NULL, new.fkidcidade,
							NULL, new.website, 
							NULL,new.fkidstatus, 
							NULL);
							RETURN NEW;
		END IF;
							
		IF TG_OP = 'UPDATE' THEN
			INSERT INTO logempresas VALUES (old.idempresas, new.nome, old.nome, 
							new.cnpj, old.cnpj, new.telefone, 
							old.telefone, new.fax, 
							old.fax, new.fkidpais, 
							old.fkidpais, new.fkidestado, 
							old.fkidestado, new.fkidcidade,
							old.fkidcidade, new.website, 
							old.website,new.fkidstatus, 
							old.fkidstatus);
							RETURN NEW;			
		END IF;

		IF TG_OP = 'DELETE' THEN
			INSERT INTO logempresas VALUES (old.idempresas, NULL, old.nome, 
							NULL, old.cnpj, NULL, 
							old.telefone, NULL, 
							old.fax, NULL, 
							old.fkidpais, NULL, 
							old.fkidestado, NULL,
							old.fkidcidade, NULL, 
							old.website,NULL, 
							old.fkidstatus);
							RETURN OLD;			
		END IF;
		
		RETURN NEW;
	END;
$LOGEMPRESAS$ LANGUAGE PLPGSQL;

CREATE TRIGGER LOGEMPRESAS BEFORE INSERT OR UPDATE
ON EMPRESAS FOR EACH ROW EXECUTE PROCEDURE LOG_EMPRESAS_FUNC();


 /* Fases */
CREATE TABLE logfases
(
 idlogfases serial not null,
 nome_novo character varying(50),
 nome_antigo character varying(50),
 fkidstatus_novo integer,
 fkidstatus_antigo integer
);

CREATE OR REPLACE FUNCTION LOG_FASES_FUNC() RETURNS TRIGGER AS $LOGFASES$
	DECLARE
		xfases fases%ROWTYPE;
	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO logfases VALUES( new.idfases, new.nome, NULL, new.fkidstatus, NULL);
			RETURN NEW;	
		END IF;	
			
		IF TG_OP = 'UPDATE' THEN
			INSERT INTO logfases VALUES( old.idfases, new.nome, old.nome, new.fkidstatus, old.fkidstatus);	
			RETURN NEW;
		END IF;

		IF TG_OP = 'DELETE' THEN
			INSERT INTO logfases VALUES( old.idfases, NULL, old.nome, NULL, old.fkidstatus);	
			RETURN OLD;
		END IF;	
			
		RETURN NEW;
	END;
$LOGFASES$ LANGUAGE PLPGSQL;

CREATE TRIGGER LOGFASES BEFORE INSERT OR UPDATE OR DELETE
ON FASES FOR EACH ROW EXECUTE PROCEDURE LOG_FASES_FUNC();

/* Atividade */
CREATE TABLE logatividade
(
  idlogatividade serial not null,
  fkidoportunidades_novo integer,
  fkidoportunidades_antigo integer,
  fkidempresas_novo integer,
  fkidempresas_antigo integer,
  descricao_novo character varying(500),
  descricao_antigo character varying(500),
  dataretorno_novo date,
  dataretorno_antigo date,
  fkidusuarios_novo integer,
  fkidusuarios_antigo integer,
  fkidstatus_novo integer,
  fkidstatus_antigo integer
);

CREATE OR REPLACE FUNCTION LOG_ATIVIDADE_FUNC() RETURNS TRIGGER AS $LOGATIVIDADE$
	DECLARE 

	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO logatividade VALUES(new.idatividade, new.fkidoportunidades, NULL, new.fkidempresas, NULL, 
							new.descricao, NULL, new.dataretorno, NULL,
							new.fkidusuarios, NULL, new.fkidstatus, NULL);
							RETURN NEW;
		END IF;
							
		IF TG_OP = 'UPDATE' THEN
			INSERT INTO logatividade VALUES(old.idatividade, new.fkidoportunidades, old.fkidoportunidades, new.fkidempresas, old.fkidempresas, 
							new.descricao, old.descricao, new.dataretorno, old.dataretorno,
							new.fkidusuarios, old.fkidusuarios, new.fkidstatus, old.fkidstatus);
							RETURN NEW;
		END IF;

		IF TG_OP = 'DELETE' THEN
			INSERT INTO logatividade VALUES(old.idatividade, NULL, old.fkidoportunidades, NULL, old.fkidempresas, 
							NULL, old.descricao, NULL, old.dataretorno,
							NULL, old.fkidusuarios, NULL, old.fkidstatus);
							RETURN OLD;
		END IF;
		
		RETURN NEW;
	END;
$LOGATIVIDADE$ LANGUAGE PLPGSQL;

CREATE TRIGGER LOGATIVIDADE BEFORE INSERT OR UPDATE OR DELETE
ON ATIVIDADE FOR EACH ROW EXECUTE PROCEDURE LOG_ATIVIDADE_FUNC();

/* Origem leads */

CREATE TABLE logorigemleads
(
  logidorigemleads serial not null,
  nome_novo character varying(500),
  nome_antigo character varying(500),
  fkidstatus_novo integer,
  fkidstatus_antigo integer
);

CREATE OR REPLACE FUNCTION LOG_ORIGEMLEADS_FUNC() RETURNS TRIGGER AS $LOGORIGEMLEADS$
	DECLARE

	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO LOGORIGEMLEADS VALUES(new.idorigemleads, new.nome, NULL, new.fkidstatus, NULL);		
			RETURN NEW;
		END IF;
		
		IF TG_OP = 'UPDATE' THEN
			INSERT INTO LOGORIGEMLEADS VALUES(old.idorigemleads, new.nome, old.nome, new.fkidstatus, old.fkidstatus);
			RETURN NEW;
		END IF;

		IF TG_OP = 'DELETE' THEN
			INSERT INTO LOGORIGEMLEADS VALUES(old.idorigemleads, NULL, old.nome, NULL, old.fkidstatus);
			RETURN OLD;
		END IF;
		
		RETURN NEW;
	END;
$LOGORIGEM$ LANGUAGE PLPGSQL;

CREATE TRIGGER LOGORIGEMLEADS BEFORE INSERT OR UPDATE OR DELETE 
ON ORIGEMLEADS FOR EACH ROW EXECUTE PROCEDURE LOG_ORIGEMLEADS_FUNC();

/* Agenda de compromisso */	
CREATE TABLE logagendadecompromisso
(
  idlogagendadecompromisso serial not null,
  titulo_novo character varying(50),
  titulo_antigo character varying(50),
  datacompromisso_novo date,
  datacompromisso_antigo date,
  hora_inicio_novo time,
  hora_inicio_antigo time, 
  hora_fim_novo time,
  hora_fim_antigo time,
  descricao_novo varchar(200),
  descricao_antigo varchar(200),
  fkidusuarios_novo integer,
  fkidusuarios_antigo integer
);

CREATE OR REPLACE FUNCTION LOG_AGENDADECOMPROMISSO_FUNC() RETURNS TRIGGER AS $LOGAGENDADECOMPROMISSO$
	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO LOGAGENDADECOMPROMISSO VALUES (new.idagendadecompromisso, new.titulo, NULL, new.data_compromisso, NULL,
							   new.hora_inicio, NULL, new.hora_fim, NULL, new.descricao, 
							   old.descricao, new.fkidusuarios, old.fkidusuarios);
							   RETURN NEW;
                END IF;

                IF TG_OP = 'UPDATE' THEN
			INSERT INTO LOGAGENDADECOMPROMISSO VALUES (old.idagendadecompromisso, new.titulo, old.titulo, new.data_compromisso, old.data_compromisso,
							   new.hora_inicio, old.hora_inicio, new.hora_fim, old.hora_fim, new.descricao, 
							   old.descricao, new.fkidusuarios, old.fkidusuarios);                
							   RETURN NEW;
                END IF;	

                IF TG_OP = 'DELETE' THEN
			INSERT INTO LOGAGENDADECOMPROMISSO VALUES (old.idagendadecompromisso, NULL, old.titulo, NULL, old.data_compromisso,
							   NULL, old.hora_inicio, NULL, old.hora_fim, NULL, 
							   old.descricao, NULL, old.fkidusuarios);                
							   RETURN OLD;
                END IF;
                		
                RETURN NEW;				   							  
	END;
$LOGAGENDADECOMPROMISSO$ LANGUAGE PLPGSQL;	


CREATE TRIGGER LOGAGENDADECOMPROMISSO BEFORE INSERT OR UPDATE OR DELETE
ON AGENDADECOMPROMISSO FOR EACH ROW EXECUTE PROCEDURE LOG_AGENDADECOMPROMISSO_FUNC();

/* Campanha */
CREATE TABLE logcampanha
(
  idlogcampanha serial not null,
  nome_novo varchar(50),
  nome_antigo varchar(50),
  descricao_novo varchar(150),
  descricao_antigo varchar(150),
  fkidstatus_novo integer,
  fkidstatus_antigo integer  
);

CREATE OR REPLACE FUNCTION LOG_CAMPANHAS_FUNC() RETURNS TRIGGER AS $LOGCAMPANHAS$
	DECLARE

	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO LOGCAMPANHA VALUES(new.idcampanhas, new.nome, NULL, new.descricao, NULL,
						       new.fkidstatus, NULL);
						       RETURN NEW;
		END IF;	 
		
		IF TG_OP = 'UPDATE' THEN
			INSERT INTO LOGCAMPANHA VALUES(old.idcampanhas, new.nome, old.nome, new.descricao, old.descricao,
						       new.fkidstatus, old.fkidstatus);
						       RETURN NEW;
		END IF;
		
		IF TG_OP = 'DELETE' THEN
			INSERT INTO LOGCAMPANHA VALUES(old.idcampanhas, NULL, old.nome, NULL, old.descricao,
						       NULL, old.fkidstatus);
						       RETURN OLD;
		END IF;				
		RETURN NEW;	       
	END;
$LOGCAMPANHAS$ LANGUAGE PLPGSQL;
	
CREATE TRIGGER LOGCAMPANHAS BEFORE INSERT OR UPDATE OR DELETE
ON campanhas FOR EACH ROW EXECUTE PROCEDURE LOG_CAMPANHAS_FUNC();


/* Pais */
CREATE TABLE logpais 
(
  idlogpais serial not null,
  nome_novo varchar(50),
  nome_antigo varchar(50),
  fkidstatus_novo integer,
  fkidstatus_antigo integer
);

CREATE OR REPLACE FUNCTION LOG_PAIS_FUNC() RETURNS TRIGGER AS $LOGPAIS$
	DECLARE

	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO LOGPAIS VALUES(new.idpais, new.nome, NULL, new.fkidstatus, NULL);
			RETURN NEW;
		END IF;

		IF TG_OP = 'UPDATE' THEN
			INSERT INTO LOGPAIS VALUES(old.idpais, new.nome, old.nome, new.fkidstatus, old.fkidstatus);
			RETURN NEW;
		END IF;	

		IF TG_OP = 'DELETE' THEN
			INSERT INTO LOGPAIS VALUES(old.idpais, NULL, old.nome, NULL, old.fkidstatus);
			RETURN OLD;
		END IF;
		
		RETURN NEW;
	END;
$LOGPAIS$ LANGUAGE PLPGSQL;

CREATE TRIGGER LOGPAIS BEFORE INSERT OR UPDATE OR DELETE
ON PAIS FOR EACH ROW EXECUTE PROCEDURE LOG_PAIS_FUNC();

/* Estado */
CREATE TABLE LOGESTADO 
(
  idlogestado serial not null,
  fkidpais_novo integer,
  fkidpais_antigo integer,
  nome_novo varchar(50),
  nome_antigo varchar(50),
  fkidstatus_novo integer,
  fkidstatus_antigo integer
);

CREATE OR REPLACE FUNCTION LOG_ESTADO_FUNC() RETURNS TRIGGER AS $LOGESTADO$
	DECLARE

	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO LOGESTADO VALUES(new.idestado, new.fkidpais, NULL, new.nome, NULL, new.fkidstatus, NULL);
			RETURN NEW;
		END IF;

		IF TG_OP = 'UPDATE' THEN
			INSERT INTO LOGESTADO VALUES(old.idestado, new.fkidpais, old.fkidpais, new.nome, old.nome, new.fkidstatus, old.fkidstatus);
			RETURN NEW;
		END IF;	

		IF TG_OP = 'DELETE' THEN
			INSERT INTO LOGESTADO VALUES(old.idestado,  NULL, old.fkidpais,  NULL, old.nome,  NULL, old.fkidstatus);
			RETURN OLD;
		END IF;
		RETURN NEW;
	END;
$LOGESTADO$ LANGUAGE PLPGSQL;

CREATE TRIGGER LOGESTADO BEFORE INSERT OR UPDATE OR DELETE
ON ESTADO FOR EACH ROW EXECUTE PROCEDURE LOG_ESTADO_FUNC();

/* Cidade */
CREATE TABLE LOGCIDADE
(
  idlogcidade serial not null,
  fkidpais_novo integer,
  fkidpais_antigo integer,
  fkidestado_novo integer,
  fkidestado_antigo integer,
  nome_novo varchar(50),
  nome_antigo varchar(50),
  fkidstatus_novo integer,
  fkidstatus_antigo integer
);

CREATE OR REPLACE FUNCTION LOG_CIDADE_FUNC() RETURNS TRIGGER AS $LOGCIDADE$
	DECLARE

	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO LOGCIDADE VALUES(new.idcidade, new.fkidpais, NULL, new.fkidestado, NULL, new.nome, NULL, new.fkidstatus, NULL);
			RETURN NEW;
		END IF;

		IF TG_OP = 'UPDATE' THEN
			INSERT INTO LOGCIDADE VALUES(old.idcidade, new.fkidpais, old.fkidpais, new.fkidestado, old.fkidestado, new.nome, old.nome, new.fkidstatus, old.fkidstatus);
			RETURN NEW;
		END IF;	

		IF TG_OP = 'DELETE' THEN
			INSERT INTO LOGCIDADE VALUES(old.idcidade, NULL, old.fkidpais, NULL, old.fkidestado, NULL, old.nome, NULL, old.fkidstatus);
			RETURN OLD;
		END IF;	
		
		
	END;
$LOGCIDADE$ LANGUAGE PLPGSQL;

CREATE TRIGGER LOGCIDADE BEFORE INSERT OR UPDATE OR DELETE
ON CIDADE FOR EACH ROW EXECUTE PROCEDURE LOG_CIDADE_FUNC();

/* Status */
CREATE TABLE LOGSTATUS
(
  idlogstatus serial not null,
  status_novo varchar(10),
  status_antigo varchar(10)
);

CREATE OR REPLACE FUNCTION LOG_STATUS_FUNC() RETURNS TRIGGER AS $LOGSTATUS$
	DECLARE

	BEGIN
		IF TG_OP = 'INSERT' THEN
			INSERT INTO LOGSTATUS VALUES(new.idstatus, new.status, null);
			RETURN NEW;
		END IF;

		IF TG_OP = 'UPDATE' THEN
			INSERT INTO LOGSTATUS VALUES(old.idstatus, new.status, old.status);
			RETURN NEW;
		END IF;

		IF TG_OP = 'DELETE' THEN
			INSERT INTO LOGSTATUS VALUES(old.idstatus, null, old.status);
			RETURN OLD;
		END IF;
		
		RETURN NEW;
	END;
$LOGSTATUS$ LANGUAGE PLPGSQL;


CREATE TRIGGER LOGSTATUS BEFORE INSERT OR UPDATE OR DELETE
ON STATUS FOR EACH ROW EXECUTE PROCEDURE LOG_STATUS_FUNC();


/* Finalizar oportunidades vinculadas na campanha*/

CREATE OR REPLACE FUNCTION DELETA_OPORTUNIDADE_FUNC() RETURNS TRIGGER AS $DELETA_OPORTUNIDADE$
	DECLARE

	BEGIN
		IF TG_OP = 'UPDATE' THEN
			IF new.fkidstatus = 1 THEN
				/*FOR row_opor IN UPDATE oportunidades SET fkidstatus = 1 WHERE fkidcampanhas = new.idcampanhas LOOP					
				END LOOP;*/
				UPDATE oportunidades SET fkidstatus = 1 WHERE fkidcampanhas = new.idcampanhas;
			END IF;	
			RETURN NEW;											
		END IF;
	END;
$DELETA_OPORTUNIDADE$ LANGUAGE PLPGSQL;

CREATE TRIGGER DELETA_OPORTUNIDADE AFTER UPDATE
ON CAMPANHAS FOR EACH ROW EXECUTE PROCEDURE DELETA_OPORTUNIDADE_FUNC();

/* Finalizar todas as atividades vinculadas na oportunidade */

CREATE OR REPLACE FUNCTION DELETA_ATIVIDADE_FUNC() RETURNS TRIGGER AS $DELETA_ATIVIDADE$
	DECLARE
		row_opor oportunidades%ROWTYPE;
	BEGIN
		IF TG_OP = 'UPDATE' THEN
			IF new.fkidstatus = 3 OR new.fkidstatus = 4 THEN
				FOR row_opor IN SELECT * FROM oportunidades WHERE idoportunidades = new.idoportunidades LOOP
					IF row_opor.data_finalizacao IS NULL THEN
						UPDATE atividade SET fkidstatus = 1 WHERE fkidoportunidades = row_opor.idoportunidades;
					ELSE
						UPDATE atividade SET fkidstatus = 2 WHERE fkidoportunidades = row_opor.idoportunidades;
					END IF;
				END LOOP;
				--UPDATE atividade SET fkidstatus = 1 WHERE fkidoportunidades = new.idoportunidades;
			END IF;	
			RETURN NEW;											
		END IF;
	END;
$DELETA_ATIVIDADE$ LANGUAGE PLPGSQL;

CREATE TRIGGER DELETA_ATIVIDADE AFTER UPDATE
ON OPORTUNIDADES FOR EACH ROW EXECUTE PROCEDURE DELETA_ATIVIDADE_FUNC();

/* Inativar todos os contatos que tem o vincula com aquela empresa */

CREATE OR REPLACE FUNCTION DELETA_CONTATO_FUNC() RETURNS TRIGGER AS $DELETA_CONTATO$
	DECLARE
	
	BEGIN
		IF TG_OP = 'UPDATE' THEN
			IF new.fkidstatus = 1 THEN
				/*FOR row_opor IN UPDATE oportunidades SET fkidstatus = 1 WHERE fkidcampanhas = new.idcampanhas LOOP					
				END LOOP;*/
				UPDATE contatos SET fkidstatus = 1 WHERE fkidempresas = new.idempresas;
			END IF;	
			RETURN NEW;											
		END IF;
	END;
$DELETA_CONTATO$ LANGUAGE PLPGSQL;


CREATE TRIGGER DELETA_CONTATO AFTER UPDATE
ON EMPRESAS FOR EACH ROW EXECUTE PROCEDURE DELETA_CONTATO_FUNC();


